package com.hl.toolkit.server.bdpay;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;
import java.util.logging.Level;


public class RefundReturnServlet extends HttpServlet {
 	private ServletConfig config = null;
	
	public RefundReturnServlet() {
		super();
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
	     doPost(request,response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		request.setCharacterEncoding("gbk");
 		System.out.println( "response编码："+response.getCharacterEncoding());
		
	    String getStrPre=request.getQueryString();//支付返回串,查看返回那些字段，返回的字段不管是否为空，均参与签名
	    String getStr=URLDecoder.decode(getStrPre, "gbk");//url解码
	    System.out.println("浏览器地址栏中？后面的字符串:"+getStr+";打印结束");
	    String  []resultStrTemp=getStr.split("&");//把返回的参数用split取出来
	    String  []resultStr=new String[resultStrTemp.length-1];
	    
	    String signtemp=resultStrTemp[resultStrTemp.length-1];//取签名串
	    String sign=signtemp.substring(signtemp.indexOf("=")+1,signtemp.length());

	    System.arraycopy(resultStrTemp, 0, resultStr, 0, resultStr.length);//数组复制
        
		//签名拼接，需要去掉返回的签名串字段sign
		String  Localsign=new BfbSdkComm().make_sign(resultStr);
		System.out.println("本地签名串            ："+Localsign);
		System.out.println("百度钱包返回签名串："+sign+"<br/>");
		System.out.println(Level.OFF);  //打印完成关闭日志
		if("1".equals(request.getParameter("ret_code"))) //比对签名	
		{
			if(sign.trim().equalsIgnoreCase(Localsign.trim()))
			{    
				StringBuffer str = new StringBuffer();
				/**
				 * 支付通知结果的回执
				 * 作用：收到通知，并验证通过，向百度钱包发起回执。百度钱包GET请求商户的return_url页面，商户这边的响应
				 * 		  中必须包含以下部分，百度钱包只有接收到特定的响应信息后，才能确认商户已经收到通知，并验证通过。这样
				 * 		  百度钱包才不会再向商户发送支付结果通知
				 */
				str.append("<HTML><head>");
				str.append("<meta name=\"VIP_BFB_PAYMENT\" content=\"BAIFUBAO\">");
				str.append("</head>");
				str.append("<body>");
				str.append("退款成功，验签通过"+"订单号："+request.getParameter("order_no")+"<br/>");
				str.append("百度钱包返回的签名串 :"+sign+"<br/>");
				str.append("本地生成的签名串     :"+Localsign+"<br/>");
				str.append("</body></html>");
				Structs2Util.render(response, str.toString());
				/**
				 *  1、重要：接收到百度钱包的后台通知后，商户须返回特定的HTML页面。该页面应该满足以下要求：
				 *	2、重要：HTML头部须包括<meta name="VIP_BFB_PAYMENT" content="BAIFUBAO">
				 *	3、重要： 商户可以通过百度钱包订单查询接口再次查询订单状态，二次校验
				 *	4、重要： 该查询接口存在一定的延迟，商户可以不用二次校验，信任后台的支付结果通知便行
				 */
			}else if(!sign.trim().equalsIgnoreCase(Localsign.trim()))
			{
				Structs2Util.render(response,"退款成功，验签失败"+"<br/>");
			}   
		}else{
			Structs2Util.render(response,"退款失败"+"<br/>");
		}
	}

	public String getServletInfo() {
		return "RefundReturnServlet";
	}

	public void init(ServletConfig config) throws ServletException {
		this.config = config;
	}

	public void destroy() {
		super.destroy(); 
	}
}
